import 'package:get_storage/get_storage.dart';
import 'dart:developer' as developer;
import '../services/user_service.dart';

/// 权限工具类 - 完全模仿MyApplication2的CommunalMethodUtil权限逻辑
/// 根据用户积分等级判断免费发布活动、加好友等权限
class PermissionUtil {
  static final _storage = GetStorage();

  // 权限控制变量 - 模仿MyApplication2的静态变量
  static bool canAddFriend = false;           // 是否可以免费加好友
  static int canAddFriendNumber = 0;          // 当天免费加好友次数
  static bool canPublishActivity = false;     // 是否可以免费发布活动
  static int canPublishActivityNumber = 0;    // 当天免费发布活动次数

  // 存储键名
  static const String _dateKey = 'date_of_the_day';
  static const String _addFriendCountKey = 'add_friend_number';
  static const String _publishActivityCountKey = 'publish_activity_number';

  /// 🎯 根据用户积分设置权限 - 完全模仿MyApplication2的等级制度
  /// 这个方法与MyApplication2的accordingToUserPointsForPermission完全一致
  static void accordingToUserPointsForPermission(int userPoints) {
    developer.log('🎯 =============== 权限计算开始 ===============');
    developer.log('💰 当前用户积分: $userPoints');
    
    if (0 <= userPoints && userPoints < 100) {
      // 🎯 0~99积分：追随者等级 - 无任何免费权限
      canAddFriend = false;
      canAddFriendNumber = 0;
      canPublishActivity = false;
      canPublishActivityNumber = 0;
      developer.log('🏷️ 用户等级: 追随者 (0~99积分)');
      developer.log('❌ 加好友权限: 无 (需付费)');
      developer.log('❌ 发布活动权限: 无 (需付费)');
      
    } else if (100 <= userPoints && userPoints < 300) {
      // 🎯 100~299积分：守护者等级 - 可免费加好友1次/天
      canAddFriend = true;
      canAddFriendNumber = 1;
      canPublishActivity = false;
      canPublishActivityNumber = 0;
      developer.log('🏷️ 用户等级: 守护者 (100~299积分)');
      developer.log('✅ 加好友权限: 1次/天');
      developer.log('❌ 发布活动权限: 无 (需付费)');
      
    } else if (300 <= userPoints && userPoints < 600) {
      // 🎯 300~599积分：创造者等级 - 加好友3次/天，发布活动1次/天
      canAddFriend = true;
      canAddFriendNumber = 3;
      canPublishActivity = true;
      canPublishActivityNumber = 1;
      developer.log('🏷️ 用户等级: 创造者 (300~599积分)');
      developer.log('✅ 加好友权限: 3次/天');
      developer.log('✅ 发布活动权限: 1次/天');
      
    } else if (600 <= userPoints && userPoints < 1200) {
      // 🎯 600~1199积分：真神等级 - 加好友5次/天，发布活动2次/天
      canAddFriend = true;
      canAddFriendNumber = 5;
      canPublishActivity = true;
      canPublishActivityNumber = 2;
      developer.log('🏷️ 用户等级: 真神 (600~1199积分)');
      developer.log('✅ 加好友权限: 5次/天');
      developer.log('✅ 发布活动权限: 2次/天');
      
    } else {
      // 🎯 1200+积分：一言九鼎等级 - 加好友10次/天，发布活动5次/天
      canAddFriend = true;
      canAddFriendNumber = 10;
      canPublishActivity = true;
      canPublishActivityNumber = 5;
      developer.log('🏷️ 用户等级: 一言九鼎 (1200+积分)');
      developer.log('✅ 加好友权限: 10次/天');
      developer.log('✅ 发布活动权限: 5次/天');
    }
    
    developer.log('🎯 =============== 权限计算完成 ===============');
  }

  /// 🔄 初始化权限系统 - 在应用启动时调用
  static void initializePermissions() {
    final userService = UserService.to;
    if (userService.isLoggedIn) {
      accordingToUserPointsForPermission(userService.userPoints);
    }
  }

  /// 💰 更新用户积分并重新计算权限 - 模仿MyApplication2的changeUserPoints
  static void changeUserPoints(int pointsChange) {
    final userService = UserService.to;
    if (userService.isLoggedIn) {
      final newPoints = userService.userPoints + pointsChange;
      userService.updateUserPoints(newPoints);
      accordingToUserPointsForPermission(newPoints);
      
      developer.log('💰 =============== 积分变化处理 ===============');
      developer.log('📈 积分变化: ${pointsChange > 0 ? '+' : ''}$pointsChange');
      developer.log('💰 新积分总数: $newPoints');
      developer.log('🔄 权限已重新计算');
    }
  }

  /// 🚀 计算发布活动的free参数 - 模仿MyApplication2的逻辑
  static int calculatePublishActivityFree() {
    developer.log('🚀 =============== 计算发布活动free参数 ===============');
    
    if (!canPublishActivity) {
      developer.log('❌ 用户等级不足，无免费发布权限，返回 free = 0 (收费)');
      return 0; // 收费
    }
    
    final today = _getTodayString();
    final storedDate = _storage.read<String>(_dateKey) ?? '';
    final todayPublishCount = storedDate == today 
        ? (_storage.read<int>(_publishActivityCountKey) ?? 0) 
        : 0;
    
    developer.log('📅 今日日期: $today');
    developer.log('🗃️ 存储日期: $storedDate');
    developer.log('📊 今日已发布次数: $todayPublishCount');
    developer.log('🎯 每日免费限额: $canPublishActivityNumber');
    
    if (todayPublishCount >= canPublishActivityNumber) {
      developer.log('⚠️ 今日免费次数已用完，返回 free = 0 (收费)');
      return 0; // 收费
    } else {
      developer.log('✅ 今日还有免费次数，返回 free = 1 (免费)');
      return 1; // 免费
    }
  }

  /// 🤝 计算加好友的free参数 - 模仿MyApplication2的逻辑
  static int calculateAddFriendFree() {
    developer.log('🤝 =============== 计算加好友free参数 ===============');
    
    if (!canAddFriend) {
      developer.log('❌ 用户等级不足，无免费加好友权限，返回 free = 0 (收费)');
      return 0; // 收费
    }
    
    final today = _getTodayString();
    final storedDate = _storage.read<String>(_dateKey) ?? '';
    final todayAddFriendCount = storedDate == today 
        ? (_storage.read<int>(_addFriendCountKey) ?? 0) 
        : 0;
    
    developer.log('📅 今日日期: $today');
    developer.log('🗃️ 存储日期: $storedDate');
    developer.log('📊 今日已加好友次数: $todayAddFriendCount');
    developer.log('🎯 每日免费限额: $canAddFriendNumber');
    
    if (todayAddFriendCount >= canAddFriendNumber) {
      developer.log('⚠️ 今日免费次数已用完，返回 free = 0 (收费)');
      return 0; // 收费
    } else {
      developer.log('✅ 今日还有免费次数，返回 free = 1 (免费)');
      return 1; // 免费
    }
  }

  /// 📈 增加发布活动次数统计
  static void incrementPublishActivityCount() {
    final today = _getTodayString();
    final storedDate = _storage.read<String>(_dateKey) ?? '';
    
    if (storedDate != today) {
      // 新的一天，重置计数器
      _storage.write(_dateKey, today);
      _storage.write(_publishActivityCountKey, 1);
      developer.log('📅 新的一天开始，发布活动计数重置为1');
    } else {
      // 同一天，增加计数
      final currentCount = _storage.read<int>(_publishActivityCountKey) ?? 0;
      _storage.write(_publishActivityCountKey, currentCount + 1);
      developer.log('📈 发布活动计数增加至: ${currentCount + 1}');
    }
  }

  /// 📈 增加加好友次数统计
  static void incrementAddFriendCount() {
    final today = _getTodayString();
    final storedDate = _storage.read<String>(_dateKey) ?? '';
    
    if (storedDate != today) {
      // 新的一天，重置计数器
      _storage.write(_dateKey, today);
      _storage.write(_addFriendCountKey, 1);
      developer.log('📅 新的一天开始，加好友计数重置为1');
    } else {
      // 同一天，增加计数
      final currentCount = _storage.read<int>(_addFriendCountKey) ?? 0;
      _storage.write(_addFriendCountKey, currentCount + 1);
      developer.log('📈 加好友计数增加至: ${currentCount + 1}');
    }
  }

  /// 📅 获取今日日期字符串 (格式: yyyy-MM-dd)
  static String _getTodayString() {
    final now = DateTime.now();
    return '${now.year}-${now.month.toString().padLeft(2, '0')}-${now.day.toString().padLeft(2, '0')}';
  }

  /// ❌ 显示积分不足的提示 - 模仿MyApplication2的showNoPermissionToast
  static void showNoPermissionMessage() {
    // 这里可以显示积分不足的提示
    developer.log('❌ 积分不足，请前往充值');
    // 实际使用时可以用Get.snackbar等显示提示
  }

  /// 📊 获取今日剩余免费次数信息
  static Map<String, int> getTodayRemainingCounts() {
    final today = _getTodayString();
    final storedDate = _storage.read<String>(_dateKey) ?? '';
    
    final todayPublishCount = storedDate == today 
        ? (_storage.read<int>(_publishActivityCountKey) ?? 0) 
        : 0;
    final todayAddFriendCount = storedDate == today 
        ? (_storage.read<int>(_addFriendCountKey) ?? 0) 
        : 0;
    
    return {
      'publishActivity': (canPublishActivityNumber - todayPublishCount).clamp(0, canPublishActivityNumber),
      'addFriend': (canAddFriendNumber - todayAddFriendCount).clamp(0, canAddFriendNumber),
    };
  }

  /// 🔄 强制刷新权限（在用户积分变化后调用）
  static void refreshPermissions() {
    final userService = UserService.to;
    if (userService.isLoggedIn) {
      accordingToUserPointsForPermission(userService.userPoints);
    }
  }
}
